/* ************************************************************************

   Copyright: Juan Antonio Aldea Armenteros

   License: GPL v3

   Authors: Juan Antonio Aldea Armenteros

************************************************************************ */

/* ************************************************************************

#asset(jabber/*)

************************************************************************ */

qx.Class.define("jabber.Conexion",
{
  extend : qx.core.Object,

  events :
  {
    "estadoConectando"           : "qx.event.type.Event",
    "estadoAutentificando"       : "qx.event.type.Event",
    "estadoConectado"            : "qx.event.type.Event",
    "estadoDesconectando"        : "qx.event.type.Event",
    "estadoDesconectado"         : "qx.event.type.Event",
    "estadoErrorAutentificacion" : "qx.event.type.Event",
    "estadoErrorConexion"        : "qx.event.type.Event",
    "estadoErrorDesconocido"     : "qx.event.type.Event",
    "rosterItemRecibido"         : "qx.event.type.Data",
    "actualizarPresencia"        : "qx.event.type.Data",
    "mensajeNuevo"               : "qx.event.type.Data"
  },

  construct : function() {
    this.__conexion = new Strophe.Connection('http://bosh.metajack.im:5280/xmpp-httpbind');
  },

  members :
  {
    __conexion : null,


    /**
     * TODOC
     *
     * @return {var} TODOC
     */
    jid : function() {
      return Strophe.getBareJidFromJid(this.__conexion.jid);
    },


    /**
     * TODOC
     *
     * @param status {var} TODOC
     * @return {boolean} TODOC
     */
    callback_estado_conexion : function(status)
    {
      if (status === Strophe.Status.CONNECTING) {
        instanceConexion.fireEvent("estadoConectando");
      } else if (status === Strophe.Status.AUTHENTICATING) {
        instanceConexion.fireEvent("estadoAutentificando");
      }
      else if (status === Strophe.Status.CONNECTED)
      {
        instanceConexion.fireEvent("estadoConectado");
        instanceConexion.__conexion.addHandler(instanceConexion.callback_actualizar_presencia, null, "presence");

        //instanceConexion.__conexion.addHandler(instanceConexion.callback_modificacion_roster, "jabber:iq:roster", "iq", "set");
        instanceConexion.__conexion.addHandler(instanceConexion.callback_nuevo_mensaje, null, "message", "chat");
        var iq = $iq({ type : 'get' }).c('query', { xmlns : 'jabber:iq:roster' });
        instanceConexion.__conexion.sendIQ(iq, instanceConexion.callback_recibir_roster);
      }
      else if (status === Strophe.Status.DISCONNECTING)
      {
        instanceConexion.fireEvent("estadoDesconectando");
      }
      else if (status === Strophe.Status.DISCONNECTED)
      {
        instanceConexion.fireEvent("estadoDesconectado");
      }
      else if (status === Strophe.Status.AUTHFAIL)
      {
        instanceConexion.fireEvent("estadoErrorAutentificacion");
      }
      else if (status === Strophe.Status.CONNFAIL)
      {
        instanceConexion.fireEvent("estadoErrorConexion");
      }
      else
      {
        instanceConexion.fireEvent("estadoErrorDesconocido");
      }

      return true;
    },


    /**
     * TODOC
     *
     * @param iq {var} TODOC
     * @return {boolean} TODOC
     */
    callback_recibir_roster : function(iq)
    {
      $(iq).find('item').each(function()
      {
        var jid = $(this).attr('jid');
        var name = $(this).attr('name') || jid;

        instanceConexion.fireDataEvent("rosterItemRecibido",
        {
          jid    : jid,
          nombre : name
        });
      });

      instanceConexion.__conexion.send($pres());

      //       instanceConexion.__conexion.send($pres());
      //       qx.event.Timer.once(function(){
      // 	instanceConexion.__conexion.send($pres());
      // 	console.log("primera peticion de presencia retardada");
      //       }, this, 5000);
      //
      //       qx.event.Timer.once(function(){
      // 	instanceConexion.__conexion.send($pres());
      // 	console.log("segunda peticion de presencia retardada");
      //       }, this, 10000);
      //
      //       qx.event.Timer.once(function(){
      // 	instanceConexion.__conexion.send($pres());
      // 	console.log("tercera peticion de presencia retardada");
      //       }, this, 20000);
      return true;
    },


    /**
     * TODOC
     *
     * @param presencia {var} TODOC
     * @return {boolean} TODOC
     */
    callback_actualizar_presencia : function(presencia)
    {
      var ptype = $(presencia).attr('type');
      var from = $(presencia).attr('from');
      var show = $(presencia).find("show").text();

      if (ptype === 'subscribe') {}

      //TODO agregar contacto
      else if (ptype !== 'error')
      {
        if (ptype === 'unavailable') {
          show = 'offline';
        }
        else
        {
          if (show == "") {
            show = "available";
          }
        }
      }
      else
      {
        show = "offline";
      }

      //TODO Hay mas stanzas
      instanceConexion.fireDataEvent("actualizarPresencia",
      {
        jid       : from,
        presencia : show
      });

      console.log("Evento de presencia: " + from + " " + show);
      return true;
    },


    /**
     * TODOC
     *
     * @param credenciales {var} TODOC
     * @return {void}
     */
    conectar : function(credenciales)
    {
      //antentos a la mayor guarrada del mundo, no he tenido mas remedio
      //pues this no existe en el ambito del callback
      instanceConexion = this;
      this.__conexion = new Strophe.Connection('http://bosh.metajack.im:5280/xmpp-httpbind');
      this.__conexion.connect(credenciales.usuario, credenciales.password, this.callback_estado_conexion, 10, 10);
    },


    /**
     * TODOC
     *
     * @return {void}
     */
    desconectar : function()
    {
      if (this.__conexion != null) {
        this.__conexion.disconnect('Desconectado');
      }
    },


    /**
     * TODOC
     *
     * @param mensaje {var} TODOC
     * @return {void}
     */
    enviar_mensaje : function(mensaje)
    {
      console.log("conexion->enviar");
      var mensaje2 = mensaje.mensaje;
      var destino = mensaje.jid;
      var estado = mensaje.estado;
      console.log(mensaje2);
      console.log(destino);
      console.log(estado);

      var xml = $msg(
      {
        to     : mensaje.jid,
        "type" : "chat"
      });

      if (mensaje.mensaje.length > 0) {
        xml.c('body').t(mensaje.mensaje).up();
      }

      xml.c(mensaje.estado, { xmlns : "http://jabber.org/protocol/chatstates" });
      this.__conexion.send(xml);
    },


    /**
     * TODOC
     *
     * @param mensaje {var} TODOC
     * @return {boolean} TODOC
     */
    callback_nuevo_mensaje : function(mensaje)
    {
      var jid = Strophe.getBareJidFromJid($(mensaje).attr('from'));
      var mensaje1 = $(mensaje).find('body');

      if (mensaje1.length > 0)
      {
        var cuerpo = mensaje1.text();

        instanceConexion.fireDataEvent("nuevoMensaje",
        {
          jid     : jid,
          mensaje : cuerpo
        });
      }

      return true;
    }
  }
});